package com.tang.objectOriented.basics;


/**
 * 一．对象属性介绍
 * 1) 属性的定义语法同变量，示例：访问修饰符 属性类型 属性名;
 * 访问修饰符:控制属性的访问范围
 * 有四种访问修饰符 public, proctected, 默认, private
 * 2) 属性的定义类型可以为任意类型，包含基本类型或引用类型
 * 3) 属性如果不赋值，有默认值，规则和数组一致。
 * 具体说: int 0，short 0, byte 0, long 0, float 0.0,double 0.0，char \u0000， boolean false，String null
 * <p>
 * 二．如何创建对象
 * 1) 先声明再创建
 * Person p1 ; //声明对象 cat
 * p1 = new Person(); //创建
 * 2) 直接创建
 * Person p1 = new Person();
 * 三．如何访问属性
 * １）基本语法
 * 　对象名.属性名;
 * 　案例演示赋值和输出
 * 　p1.name;
 * 　p1.age;
 * 四．类和对象的内存分配机制(重要)
 * 　请看代码　PropertiesDetail
 */
public class PropertiesDetail02 {
    public static void main(String[] args) {
        //创建 Person 对象
        //p1 是对象名(对象引用)
        //new Person() 创建的对象空间(数据) 才是真正的对象
        Person p1 = new Person();
        //对象的属性默认值，遵守数组规则:
        //int 0，short 0, byte 0, long 0, float 0.0,double 0.0，char \u0000，boolean false，String null

        System.out.println("\n 当前这个人的信息");
        System.out.println("age=" + p1.age + " name=" + p1.name + " sal=" + p1.sal + " isPass=" + p1.isPass);

        System.out.println("\n 类和对象的内存分配机制(重要)");

        Person p2 = new Person();
        p2.name = "小明";
        p2.age = 10;

        Person p3 = p2;
        System.out.println(p3.age); //10

        /*
         * JVM内存　执行流程
         * 栈  (一般存放基本数据类型(局部变量))
         *   p2 --记录了堆的地址-->>0x0011
         *   p3 --记录了堆的地址-->>0x0011　(p3=p2  相当于把p2地址拷贝了一份给自己记录)
         * 堆　(存放对象(p2 p3 , 数组等))
         *   0x0011:[age:80,name,0x0022]  0x0022 --记录了方法区地址 --->常量池
         * 方法区　（常量池(常量，比如字符串)， 类加载信息）
         *   常量池:[0x0022:小明]
         *   加载Person 类的信息:[1.属性，２．方法]
         *
         * Java 创建对象的流程简单分析
         * Person p = new Person(); p.name = “jack”; p.age = 10
         * 1) 先加载 Person 类信息(属性和方法信息, 只会加载一次)
         * 2) 在堆中分配空间, 进行默认初始化(看规则)
         * 3) 把地址赋给 p , p 就指向对象
         * */
    }
}


class Person {
    //四个属性
    int age;
    String name;
    double sal;
    boolean isPass;
}